package com.trf.member.filter;

import com.trf.member.util.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 小小唐
 * @Date 2023/3/8-星期三-18:44
 * 我们自定一个拦截器，只有当用户登录后，才可以访问资源接口（会员、商品、供应商、员工），没有登录则要求
 * 登录。
 * 其中判断是否登录，要求客户端请求接口时，在请求头上带上 token ，然后在拦截器拦截到请求后，校验 token
 * 是否有效，有效才让访问，否则无法访问。
 * 请求头信息 Authorization: Bearer jwtToken
 *
 * @Component 定义Spring管理Bean（也就是将标注@Component注解的类交由spring管理）
 *
 * @Aspect J风格的切面可以通过 @Component 注解标识其为Spring管理Bean，
 * 而 @Aspect 注解不能被Spring自动识别并注册为Bean，必须通过@Component注解来完成
 */
@Component
public class AuthenticationFilter extends HandlerInterceptorAdapter {

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //是否登录
        boolean isLogin = false;

        // 获取请求头 Authorization: Bearer jwtToken
        final String authHeader = request.getHeader("Authorization");

        //判断是否有token，注意Bearer后面有空格
        if (authHeader != null && authHeader.startsWith("Bearer")){
            //截获jwtToken
            final String token = authHeader.substring(7);
             //解析
            Claims claims = jwtUtil.parseJWT(token);
            if (claims != null){
                if ((boolean)claims.get("isLogin")){
                    //已登录
                    isLogin = true;
                }
            }
        }

        if (!isLogin){
            response.setContentType("application/json;charset=UTF-8");
            response.setStatus(401);
            response.getWriter().write("未通过身份验证");
        }
        return isLogin;
    }
}
